package com.lujianfei.mqtt.net

import com.lujianfei.mqtt.net.config.HostInterceptor
import com.lujianfei.mqtt.net.config.HttpLogInterceptor
import com.lujianfei.mqtt.net.config.LogLevel
import com.lujianfei.mqtt.net.config.getBaseHost
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.Cache
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.io.File
import java.util.concurrent.TimeUnit
import javax.inject.Singleton

/**
 * @Author: wn
 * @Date: 2024/4/15 15:26
 * @Description: 提供 Retrofit 模块
 */
@Module
@InstallIn(SingletonComponent::class)
object RetrofitModule {
  //  提供 OkHttpClient
  @Singleton
  @Provides
  fun provideOkHttpClient(): OkHttpClient =
    OkHttpClient.Builder()
      .callTimeout(10, TimeUnit.SECONDS) // 完整请求超时时长，从发起到接收返回数据，默认值0s，不限定
      .connectTimeout(10, TimeUnit.SECONDS) // 与服务器建立连接的时长，默认--10s  秒
      .readTimeout(10, TimeUnit.SECONDS) // 读取服务器返回数据的时长  s
      .writeTimeout(10, TimeUnit.SECONDS) // 向服务器写入数据的时长，默认--10s
//      .retryOnConnectionFailure(true) // 重连
      .followRedirects(false)// 重定向
//      .cache(Cache(File("data/user/0/com.wn.caiiao/cache", "okHttp"), 1024))// 本地缓存
//      .cookieJar(LocalCookieKar())// 本地 cookies 持久化存储
//      .addInterceptor(HostInterceptor()) // BaseUrl 拦截 -- addOkDomain取消拦截
//      .addInterceptor(RetryInterceptor(1))// addInterceptor 可以多次拦截
//      .addNetworkInterceptor(RetryInterceptor(1))// 重试  只能拦截一次
//      .addNetworkInterceptor(CnInterceptor()) // 公共 header的拦截器
//      .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))// 添加拦截器
      // 添加网络拦截器，可以对okHttp的网络请求做拦截处理，不同于应用拦截器，这里能感知所有网络状态，比如重定向
      .addNetworkInterceptor(HttpLogInterceptor {
        logTag("<wn--Retrofit>")
        logLevel(LogLevel.BODY) // 设置 打印所有
      }).build()

  //  提供  Retrofit.Builder
  @Singleton
  @Provides
  fun provideRetrofitBuilder(): Retrofit.Builder =
    Retrofit.Builder()
      .addConverterFactory(GsonConverterFactory.create())
//      .addCallAdapterFactory(LiveDataCallAdapterFactory())

  /**
   * 提供  Retrofit
   * @param retrofitBuilder Builder
   * @param okHttpClient OkHttpClient
   * @return Retrofit
   * 有拦截器  HostInterceptor 替换 baseHost的拦截器
   * 修改 BaseURL  需要 修改 MMKV--SP_KEY_BASE_HOST
   */
  @Singleton
  @Provides
  fun provideRetrofit(retrofitBuilder: Retrofit.Builder, okHttpClient: OkHttpClient): Retrofit =
    retrofitBuilder.baseUrl(getBaseHost()).client(okHttpClient).build()
}